package com.uniflow.mapper;

import com.uniflow.entity.RolePermission;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 角色权限关联数据访问层
 * 
 * @author luban
 * @since 1.0.0
 */
@Mapper
public interface RolePermissionMapper {
    
    /**
     * 根据ID查询角色权限关联
     */
    RolePermission selectById(@Param("id") String id);
    
    /**
     * 根据角色ID查询权限关联列表
     */
    List<RolePermission> selectByRoleId(@Param("roleId") String roleId);
    
    /**
     * 根据权限ID查询角色关联列表
     */
    List<RolePermission> selectByPermissionId(@Param("permissionId") String permissionId);
    
    /**
     * 根据角色ID和权限ID查询关联
     */
    RolePermission selectByRoleIdAndPermissionId(@Param("roleId") String roleId, @Param("permissionId") String permissionId);
    
    /**
     * 检查角色是否有指定权限
     */
    boolean hasRolePermission(@Param("roleId") String roleId, @Param("permissionId") String permissionId);
    
    /**
     * 检查角色是否被授权指定权限
     */
    boolean isRolePermissionGranted(@Param("roleId") String roleId, @Param("permissionId") String permissionId);
    
    /**
     * 查询角色的权限ID列表
     */
    List<String> selectPermissionIdsByRoleId(@Param("roleId") String roleId);
    
    /**
     * 查询角色的已授权权限ID列表
     */
    List<String> selectGrantedPermissionIdsByRoleId(@Param("roleId") String roleId);
    
    /**
     * 查询权限的角色ID列表
     */
    List<String> selectRoleIdsByPermissionId(@Param("permissionId") String permissionId);
    
    /**
     * 查询所有角色权限关联
     */
    List<RolePermission> selectAll();
    
    /**
     * 根据创建人查询关联列表
     */
    List<RolePermission> selectByCreatedBy(@Param("createdBy") String createdBy);
    
    /**
     * 根据创建时间范围查询关联列表
     */
    List<RolePermission> selectByCreatedTimeRange(@Param("startTime") LocalDateTime startTime, 
                                                  @Param("endTime") LocalDateTime endTime);
    
    /**
     * 根据授权状态查询关联列表
     */
    List<RolePermission> selectByGranted(@Param("granted") Boolean granted);
    
    /**
     * 插入角色权限关联
     */
    int insert(RolePermission rolePermission);
    
    /**
     * 批量插入角色权限关联
     */
    int insertBatch(@Param("rolePermissions") List<RolePermission> rolePermissions);
    
    /**
     * 根据ID更新角色权限关联
     */
    int updateById(RolePermission rolePermission);
    
    /**
     * 更新授权状态
     */
    int updateGrantedStatus(@Param("roleId") String roleId, 
                           @Param("permissionId") String permissionId, 
                           @Param("granted") Boolean granted);
    
    /**
     * 根据ID删除角色权限关联
     */
    int deleteById(@Param("id") String id);
    
    /**
     * 删除角色权限关联
     */
    int deleteByRoleIdAndPermissionId(@Param("roleId") String roleId, @Param("permissionId") String permissionId);
    
    /**
     * 根据角色ID删除所有权限关联
     */
    int deleteByRoleId(@Param("roleId") String roleId);
    
    /**
     * 根据权限ID删除所有角色关联
     */
    int deleteByPermissionId(@Param("permissionId") String permissionId);
    
    /**
     * 批量删除角色权限关联
     */
    int deleteBatch(@Param("ids") List<String> ids);
    
    /**
     * 查询角色权限关联总数
     */
    Long selectCount();
    
    /**
     * 查询指定角色的权限数量
     */
    Long selectRolePermissionCount(@Param("roleId") String roleId);
    
    /**
     * 查询指定权限的角色数量
     */
    Long selectPermissionRoleCount(@Param("permissionId") String permissionId);
    
    /**
     * 查询权限分布统计
     */
    List<Map<String, Object>> selectPermissionDistributionStats();
    
    /**
     * 查询角色权限统计
     */
    List<Map<String, Object>> selectRolePermissionStats();
    
    /**
     * 查询最近分配的权限
     */
    List<RolePermission> selectRecentAssigned(@Param("limit") Integer limit);
    
    /**
     * 查询指定时间段内的权限分配记录
     */
    List<RolePermission> selectAssignedInPeriod(@Param("startTime") LocalDateTime startTime,
                                                @Param("endTime") LocalDateTime endTime);
    
    /**
     * 查询没有权限的角色列表
     */
    List<String> selectRolesWithoutPermission();
    
    /**
     * 查询没有角色的权限列表
     */
    List<String> selectPermissionsWithoutRole();
    
    /**
     * 查询角色权限变更历史
     */
    List<Map<String, Object>> selectRolePermissionHistory(@Param("roleId") String roleId);
    
    /**
     * 查询权限分配者统计
     */
    List<Map<String, Object>> selectAssignerStats();
    
    /**
     * 批量更新角色权限
     */
    int batchUpdateRolePermissions(@Param("roleId") String roleId, 
                                  @Param("permissionIds") List<String> permissionIds,
                                  @Param("granted") Boolean granted,
                                  @Param("createdBy") String createdBy,
                                  @Param("createdByName") String createdByName);
    
    /**
     * 检查权限分配冲突
     */
    List<Map<String, Object>> checkPermissionConflicts(@Param("roleId") String roleId, 
                                                       @Param("permissionIds") List<String> permissionIds);
    
    /**
     * 查询角色继承的权限
     */
    List<RolePermission> selectInheritedPermissions(@Param("roleId") String roleId);
    
    /**
     * 查询权限授权链
     */
    List<Map<String, Object>> selectPermissionAuthChain(@Param("permissionId") String permissionId);
}